package com.example.activiti6_demo.demo2;

import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;



/**
 * 动态任务办理
 */
@SpringBootTest
public class D_DynamicTask {

    /**
     * 仓储服务，用于管理流程仓库，例如：部署，删除，读取流程资源
     * 可以用来部署我们的流程图，还可以创建我们的流程部署查询对象，用于查询刚刚部署的流程列表，便于我们管理流程
     */
    @Resource
    private RepositoryService repositoryService;

    /**
     * 运行时服务，可以处理所有正在运行状态的流程实例，任务等
     * 主要用来开启流程实例，一个流程实例对应多个任务，也就是多个流程节点
     */
    @Resource
    private RuntimeService runtimeService;

    /**
     * 任务服务，用于管理，查询任务，例如：签收，办理，指派等
     * 是用来可以用来领取，完成，查询任务列表功能的
     */
    @Resource
    private TaskService taskService;


    /**
     * 动态任务处理方式一
     * 表达式方式： 使用${流程变量名称},动态取值
     */
    @Test
    public void dynamicTask1() throws Exception{
        repositoryService.createDeployment().addClasspathResource("processes/dynamicTask.bpmn").deploy();

        //动态变量
        String dynamicTask = "熊大";
        Map<String, Object> variables = new HashMap<>();
        variables.put("dealUser", dynamicTask);
        ProcessInstance instance = runtimeService.startProcessInstanceByKey("dynamicTask", variables);
        String pid = instance.getId();
        System.out.println("流程实例id：" + pid);

        List<Task> tasks = taskService.createTaskQuery().taskAssignee(dynamicTask).list();
        System.out.println(dynamicTask + "的私有任务列表：" + tasks);

        taskService.complete(tasks.get(0).getId());
        ProcessInstance instanceQuery = runtimeService.createProcessInstanceQuery().processInstanceId(pid).singleResult();
        Assertions.assertNull(instanceQuery);
        System.out.println("流程完成");


    }


    /**
     * 动态任务处理方式二
     * 动态任务分配处理（监听）器：bpmn中设置taskListener
     */
    @Test
    public void dynamicTask2() throws Exception{
        repositoryService.createDeployment().addClasspathResource("processes/dynamicTask2.bpmn").deploy();

        //动态变量
        String dynamicTask = "熊二";
        Map<String, Object> variables = new HashMap<>();
        variables.put("dealUser", dynamicTask);
        ProcessInstance instance = runtimeService.startProcessInstanceByKey("dynamicTask2", variables);
        String pid = instance.getId();
        System.out.println("流程实例id：" + pid);

        List<Task> tasks = taskService.createTaskQuery().taskAssignee(dynamicTask).list();
        System.out.println(dynamicTask + "的私有任务列表：" + tasks);

        taskService.complete(tasks.get(0).getId());

        //流程到达第二个节点，监听器动态设置了待办人
        String assignee = dynamicTask+"经理";
        List<Task> taskList = taskService.createTaskQuery().taskAssignee(assignee).list();
        System.out.println(assignee + "的私有任务列表：" + taskList);

        taskService.complete(taskList.get(0).getId());

        ProcessInstance instanceQuery = runtimeService.createProcessInstanceQuery().processInstanceId(pid).singleResult();
        Assertions.assertNull(instanceQuery);
        System.out.println("流程完成");
    }
}
